python–在Pandas中分配列时处理SettingWithCopyWarning

您所在的位置:网站首页 python dataframe拆分 python–在Pandas中分配列时处理SettingWithCopyWarning

python–在Pandas中分配列时处理SettingWithCopyWarning

#python–在Pandas中分配列时处理SettingWithCopyWarning| 来源: 网络整理| 查看: 265

参见英文答案 > How to deal with SettingWithCopyWarning in Pandas?                                    13个我有一个DataFrame,我想用包含上一行数据的列进行扩展.

这个脚本完成了这项工作:

#!/usr/bin/env python3import numpy as npimport pandas as pdn = 2df = pd.DataFrame({'A': [1,2,3,4,5], 'B': [0,1,1,0,0]}, columns=['A', 'B'])df2 = df[df['B'] == 0]print(df2)for i in range(1, n+1): df2['A_%d' % i] = df2['A'].shift(i)print(df2)

它输出:

A B0 1 03 4 04 5 0 A B A_1 A_20 1 0 NaN NaN3 4 0 1.0 NaN4 5 0 4.0 1.0

这正是我想要的. DataFrame现在有两个附加列A_1和A_2,它们包含A 1列和2行之前的值.

但是,我也得到了警告:

./my_script.py:14: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.Try using .loc[row_indexer,col_indexer] = value insteadSee the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy df2['A_%d' % i] = df2['A'].shift(i)

问题肯定来自于我创建df2之前的过滤.如果我直接使用df,则不会出现问题.在我的应用程序中,我需要单独处理原始DataFrame的多个部分,因此过滤并且绝对是必需的.所有不同的部分(如df2)都会在以后连接起来.

我在How to deal with SettingWithCopyWarning in Pandas?和Pandas SettingWithCopyWarning中发现了类似的问题,但那里的解决方案并没有解决问题.

写作例如

df2[:, 'A_%d' % i] = df2['A'].shift(i)

同样的警告仍然会发生.

我正在使用Python 3.5.2和Pandas 0.19.2

解决方法:

我想你需要copy:

df2 = df[df['B'] == 0].copy()

如果稍后修改df2中的值,您会发现修改不会传播回原始数据(df),并且Pandas会发出警告.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3